home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1997 / MacHack 1997.toast / Other Stuff / Other Stuff ’97 / PowerOS Development / basic kernel source / debug_video.c < prev    next >
C/C++ Source or Header  |  1997-06-26  |  3KB  |  130 lines

  1. /*
  2.     debug_video.c
  3.     a source file for PowerOS
  4.     copyright 1996-1997 by Ben Martz
  5.     all rights reserved world wide
  6.  
  7.     ANY AND ALL MODIFICATIONS TO THIS SOURCE MUST CREDIT THE ORIGINAL
  8.     AUTHOR, BEN MARTZ (benmartz@ic.net), AND MUST BE GIVEN TO THE AUTHOR
  9.     FOR INTEGRATION INTO THE MAIN PowerOS SOURCE TREE. THANK YOU FOR YOUR
  10.     COOPERATION!
  11. */
  12.  
  13. #include "poweros_types.h"
  14. #include "debug_video.h"
  15. #include "debug_console.h"
  16.  
  17. VideoPrivateData    videoPrivate;
  18.  
  19. void vinit(char *baseaddr, short rowbytes, short depth, short width, short height) {
  20.     short    h,v;
  21.     long    backcolor;
  22.     
  23.     videoPrivate.baseaddr = baseaddr;
  24.     videoPrivate.rowbytes = rowbytes;
  25.     videoPrivate.depth = depth;
  26.     videoPrivate.width = width;
  27.     videoPrivate.height = height;
  28.  
  29.     /* this clears the screen with a kind of venitian blind effect */
  30.     if(depth > 8) backcolor = 0L;
  31.     else backcolor = 0xFFFFFFFF;
  32.     
  33.     for(v = 0; v < videoPrivate.height; v+=4)
  34.         for(h = 0; h < videoPrivate.width; h++)
  35.             vputpixel(h,v,backcolor);
  36.     for(v = 1; v < videoPrivate.height; v+=4)
  37.         for(h = 0; h < videoPrivate.width; h++)
  38.             vputpixel(h,v,backcolor);
  39.     for(v = 2; v < videoPrivate.height; v+=4)
  40.         for(h = 0; h < videoPrivate.width; h++)
  41.             vputpixel(h,v,backcolor);
  42.     for(v = 3; v < videoPrivate.height; v+=4)
  43.         for(h = 0; h < videoPrivate.width; h++)
  44.             vputpixel(h,v,backcolor);
  45. }
  46.  
  47. void vputpixel(short h, short v, u_long value) {
  48.     char *rowbase;
  49.     if((h < 0) || (h > videoPrivate.width) || (v < 0) || (v > videoPrivate.height))
  50.         return;
  51.     
  52.     /* set the pixel location ptr */
  53.     rowbase = videoPrivate.baseaddr;
  54.     rowbase += v * videoPrivate.rowbytes;
  55.  
  56.     /*
  57.         when we have time, we should make a global variable that points
  58.         to a pixel drawing routine for a particular depth, so that the
  59.         variable is assigned at boot time and whenever the video mode
  60.         is changed, so that all drawing in between is faster since it
  61.         jumps straight to the right code -- ben
  62.     */
  63.     if(videoPrivate.depth == 1) {
  64.         if (value & 1) { 
  65.             rowbase[h >> 3] |= (128 >> (h & 7));
  66.         } else {
  67.             rowbase[h >> 3] &= ~(128 >> (h & 7));
  68.         }
  69.     } else if(videoPrivate.depth == 2) {
  70.         rowbase[h >> 2] &= (192 >> 2 * (h & 3));
  71.         rowbase[h >> 2] |= (value & 3) << 2 * (3 - (h & 3));
  72.     } else if(videoPrivate.depth == 4) {
  73.         rowbase[h >> 1] &= (h & 1) ? 0xf : 0xf0;
  74.         rowbase[h >> 1] |= (value & 15) << 4 * (1 - (h & 1));
  75.     } else if(videoPrivate.depth == 8) {
  76.         rowbase[h] = value;
  77.     } else if(videoPrivate.depth == 16) {
  78.         ((u_short *) rowbase)[h] = value;
  79.     } else if(videoPrivate.depth == 32) {
  80.         /* ouch??? this doesn't work? */
  81.         ((u_long *) rowbase)[h] = value;
  82.     } else {
  83.         if (value & 1) { 
  84.             rowbase[h >> 3] |= (128 >> (h & 7));
  85.         } else {
  86.             rowbase[h >> 3] &= ~(128 >> (h & 7));
  87.         }
  88.     }
  89. }
  90.  
  91. /* this should be in assembly...duh */
  92. void vscrollup(short pixels) {
  93.     long    offset,total;
  94.     long    *base,*oldbase;
  95.     long    oldrow;
  96.     
  97.     total = (videoPrivate.height - pixels) * videoPrivate.rowbytes;
  98.     base = (long *) videoPrivate.baseaddr;
  99.     oldrow = pixels * videoPrivate.rowbytes;
  100.     oldbase = (long *)(videoPrivate.baseaddr + oldrow);
  101.     
  102.     --base;
  103.     --oldbase;
  104.     for(offset = 0; offset < total; offset += 4) {
  105.         *(++base) = *(++oldbase);
  106.     }
  107.     
  108.     if(videoPrivate.depth == 8) {
  109.         for(offset = 0; offset < oldrow; offset += 4) {
  110.             *(++base) = 0xFFFFFFFF;
  111.         }
  112.     } else {
  113.         for(offset = 0; offset < oldrow; offset += 4) {
  114.             *(++base) = 0L;
  115.         }
  116.     }
  117. }
  118.  
  119. char vgetdepth(void) {
  120.     return videoPrivate.depth;
  121. }
  122.  
  123. short vgetwidth(void) {
  124.     return videoPrivate.width;
  125. }
  126.  
  127. short vgetheight(void) {
  128.     return videoPrivate.height;
  129. }
  130.